home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Add-On
/
Workbench Add-On - Volume 1.iso
/
Util
/
Archiver
/
Zoo
/
zoo
/
msdos.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-07-17
|
2KB
|
98 lines
/* msdos.c */
/* Highly system-dependent routines go here */
/* settime() */
/* Accepts a date/time in DOS format and sets the file time. Returns 1
if OK, 0 if error */
#include "options.h"
#include "zoo.h"
#include "zooio.h" /* to satisfy declarations in zoofns.h */
#include "zoofns.h"
#include "errors.i"
#include <stdio.h> /* to get fileno() */
/* register definitions specific for Turbo C */
union REGS {
struct { unsigned ax, bx, cx, dx, si, di, carry, flags; } x;
struct { unsigned char al, ah, bl, bh, cl, ch, dl, dh; } h;
};
int settime (file,date,time)
ZOOFILE file;
unsigned date, time;
{
extern intdos();
union REGS regs;
regs.h.ah = 0x57; /* DOS FileTimes call */
regs.h.al = 0x01; /* set date/time request */
regs.x.bx = fileno (file); /* get handle */
regs.x.cx = time;
regs.x.dx = date;
/* first flush file so later write won't occur on close */
fflush (file);
intdos (®s, ®s);
if (regs.x.carry != 0)
return (0);
else
return (1);
} /* settime */
/* gets date and time of file */
gettime (file,date,time)
ZOOFILE file;
unsigned *date, *time;
{
union REGS regs;
regs.h.ah = 0x57; /* DOS FileTimes call */
regs.h.al = 0x00; /* get date/time request */
regs.x.bx = fileno (file); /* get handle */
intdos (®s, ®s);
*time = regs.x.cx;
*date = regs.x.dx;
if (regs.x.carry != 0)
return (0);
else
return (1);
} /* settime */
/* space() */
/* Returns free space in bytes on disk n (0 = default, 1 = A, etc.). Returns
0 if drive number is invalid. Before getting disk space, the function
requests DOS to flush its internal buffers */
unsigned long space (drive, alloc_size)
int drive;
int *alloc_size;
{
unsigned long free_space;
union REGS regs;
regs.h.ah = 0x0d; /* disk reset DOS call */
intdos (®s, ®s);
regs.h.ah = 0x36; /* GetFreeSpace DOS call */
regs.h.dl = drive;
intdos (®s, ®s);
/* space = clusters * sectors/cluster * bytes/sector. */
/* ax=0xFFFF on error */
/* cluster size = sectors/cluster * bytes/sector */
*alloc_size = regs.x.ax * regs.x.cx;
/* space = cluster * alloc_size */
if (regs.x.ax == 0xffff)
return (0L); /* invalid drive */
else {
free_space = ((unsigned long) regs.x.bx) * *alloc_size;
return (free_space);
}
}